import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useUserStore } from '@/stores/user'
import router from '@/router'

// 创建axios实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
  },
})

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    const userStore = useUserStore()
    const token = userStore.token
    
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    // 直接返回后端的完整响应数据结构
    // 后端返回格式: { code: 200, message: "操作成功", data: {...}, isSuccess: true }
    const responseData = response.data
    
    // 检查是否为成功响应
    if (responseData.code === 200) {
      // 返回完整的响应对象，让调用方决定如何处理
      return responseData
    } else if (responseData.code === 401) {
      // 未授权，清除token并跳转到登录页（未登录时不弹业务错误）
      if (router.currentRoute.value.path !== '/forgot-password') {
        const userStore = useUserStore()
        const hadToken = !!userStore.token
        userStore.logout()
        if (router.currentRoute.value.path !== '/login') {
          router.push('/login')
        }
        // 只有已登录状态下才弹出过期提示
        if (hadToken) {
          ElMessage.error('登录已过期，请重新登录')
        }
      }
      return Promise.reject(new Error('Unauthorized'))
    } else {
      // 其他业务错误
      const errorMessage = responseData.message || '请求失败'
      ElMessage.error(errorMessage)
      return Promise.reject(new Error(errorMessage))
    }
  },
  (error) => {
    let errorMessage = '网络错误'
    
    if (error.response) {
      const { status, data } = error.response
      
      switch (status) {
        case 400:
          errorMessage = data?.message || '请求参数错误'
          break
        case 401:
          // 未授权，未登录时不弹业务错误，直接跳转登录页
          if (router.currentRoute.value.path !== '/forgot-password') {
            const userStore = useUserStore()
            const hadToken = !!userStore.token
            userStore.logout()
            if (router.currentRoute.value.path !== '/login') {
              router.push('/login')
            }
            if (hadToken) {
              errorMessage = '登录已过期，请重新登录'
            } else {
              errorMessage = '' // 未登录时不弹错误
            }
          }
          break
        case 403:
          errorMessage = '禁止访问'
          break
        case 404:
          errorMessage = '请求资源不存在'
          break
        case 409:
          errorMessage = data?.message || '资源冲突'
          break
        case 422:
          errorMessage = data?.message || '数据验证失败'
          break
        case 429:
          errorMessage = data?.message || '请求过于频繁，请稍后重试'
          break
        case 500:
          errorMessage = '服务器内部错误'
          break
        case 502:
          errorMessage = '网关错误'
          break
        case 503:
          errorMessage = '服务不可用'
          break
        case 504:
          errorMessage = '网关超时'
          break
        default:
          errorMessage = data?.message || `请求失败 (${status})`
      }
    } else if (error.request) {
      // 网络连接问题
      if (error.code === 'NETWORK_ERROR' || error.message === 'Network Error') {
        errorMessage = '网络连接失败，请检查网络设置'
      } else if (error.code === 'ECONNABORTED') {
        errorMessage = '请求超时，请重试'
      } else {
        errorMessage = '网络连接失败'
      }
    } else {
      errorMessage = error.message || '未知错误'
    }
    
    // 创建一个包含详细错误信息的错误对象
    const customError = new Error(errorMessage)
    customError.code = error.code
    customError.response = error.response
    customError.request = error.request
    
    return Promise.reject(customError)
  }
)

export default request
